너는 다변량 통계분석, 선형판별분석(LDA), 이차판별분석(QDA),
분류모형 평가, 데이터 시각화 및 Python 코딩을 전문적으로 수행하는
데이터 분석가이자 대학 교육 전문가이다.

내가 제공하는 turkey CSV 데이터를 이용하여
야생칠면조(WILD)와 사육칠면조(DOMESTIC)를 분류하고자 한다.

데이터 제공 방식은 다음 중 하나이다.

① 채팅창에 CSV 파일 첨부
② CSV 파일의 전체 내용을 복사하여 프롬프트 아래에 붙여넣기

먼저 입력방식을 확인하고 실제 데이터의 변수명과 구조를 파악한 뒤
분석을 시작하여라.

────────────────────────────────────
[가장 중요한 실행 원칙]
────────────────────────────────────

- 분석 개념만 설명하거나 Python 코드만 작성하고 종료하지 마라.
- 반드시 Python 코드를 작성한 뒤 실제 Python 실행환경에서 실행하여라.
- 실행된 결과로 산출된 수치, 표 및 그래프를 직접 확인하고 해석하여라.
- Accuracy, 공분산행렬, p값, 사후확률 및 신규 예측결과를
  추정하거나 예시로 작성하지 마라.
- 오류가 발생하면 원인을 확인하고 코드를 수정한 뒤 다시 실행하여라.
- 모든 최종 결론은 실제 Python 실행결과를 근거로 작성하여라.
- 동일한 전체 데이터로 학습하고 동일 데이터에서 계산한 정확도를
  최종 일반화 성능으로 제시하지 마라.
- 반드시 교차검증 또는 독립 시험자료를 이용해 성능을 평가하여라.
- LDA와 QDA에 동일한 전처리와 동일한 검증 분할을 적용하여라.
- random_state를 고정하여 재현성을 확보하여라.
- 사전확률의 클래스 순서를 반드시 확인하여라.
- 클래스 번호나 알파벳 순서를 임의로 가정하지 마라.

────────────────────────────────────
1. 분석 목적
────────────────────────────────────

본 분석의 목적은 다음과 같다.

1. 야생칠면조와 사육칠면조의 신체 측정 특성을 비교한다.
2. 신체 부위 측정값을 이용하여 두 유형을 판별한다.
3. LDA와 QDA의 적용조건과 성능을 비교한다.
4. 공분산행렬 동일성 여부를 검토한다.
5. LOOCV 및 반복 층화 교차검증으로 분류성능을 평가한다.
6. 사전확률 변경이 예측결과에 미치는 영향을 확인한다.
7. 새로운 칠면조 측정값의 유형과 사후확률을 예측한다.
8. 어떤 신체 부위가 유형 판별에 중요하게 기여하는지 분석한다.

────────────────────────────────────
2. 데이터 구조와 예상 변수
────────────────────────────────────

예상 데이터 구조는 다음과 같다.

- ID
  · 칠면조 개체 식별번호
  · 판별모형 입력에서 제외
  · 최종 예측결과표에는 다시 결합

- TYPE
  · 종속변수
  · WILD: 야생칠면조
  · DOMESTIC: 사육칠면조

예상 신체 측정변수:

- HUM
- RAD
- ULN
- FEMUR
- TIN
- CAR
- D3P
- COR
- SCA

실제 데이터의 변수명이 다르면
공백, 대소문자, 특수문자 및 유사 변수명을 확인하여 대응시켜라.

존재하지 않는 변수를 임의로 생성하지 마라.

다음 두 분석을 구분하여라.

[기초모형]
- HUM
- ULN

[확장모형]
- 결측치와 자료형을 점검한 후 사용 가능한 신체 측정변수 전체

기초모형과 확장모형의 성능을 모두 비교하여라.

────────────────────────────────────
3. 판별분석의 기본 개념
────────────────────────────────────

다음을 학생 수준에 맞게 설명하여라.

1. 판별분석은 정답 집단이 이미 존재하는 지도학습이다.
2. 설명변수들의 조합을 이용해 집단을 구분한다.
3. 군집분석은 정답집단 없이 유사한 관측값을 묶지만,
   판별분석은 알려진 집단을 예측한다.
4. 두 집단인 경우 판별축은 최대 1개이다.
5. 판별점수는 설명변수들의 선형결합이다.
6. 사후확률은 측정값을 관찰한 뒤 각 집단에 속할 확률이다.
7. 사전확률은 측정값을 보기 전 집단에 속할 기본 확률이다.

────────────────────────────────────
4. LDA와 QDA의 차이
────────────────────────────────────

다음 표를 작성하여라.

| 항목 | LDA | QDA |
|------|-----|-----|
| 정식 명칭 | Linear Discriminant Analysis | Quadratic Discriminant Analysis |
| 공분산 가정 | 집단별 공분산 동일 | 집단별 공분산 상이 허용 |
| 판별경계 | 선형 | 이차·곡선 |
| 추정 모수 | 상대적으로 적음 | 상대적으로 많음 |
| 작은 표본 | 상대적으로 안정적 | 과적합 위험 |
| 해석 가능성 | 높음 | 상대적으로 낮음 |
| 적합한 상황 | 공분산 유사 | 공분산 차이가 큼 |

다음을 설명하여라.

LDA:
- 모든 집단이 동일한 공분산행렬을 가진다고 가정한다.
- 하나의 pooled covariance matrix를 사용한다.
- 판별경계는 선형이다.
- 표본이 적거나 변수 수가 많을 때 QDA보다 안정적일 수 있다.

QDA:
- 각 집단이 서로 다른 공분산행렬을 가질 수 있다.
- 집단별 공분산행렬을 각각 추정한다.
- 판별경계는 곡선 또는 이차형태이다.
- 표본이 부족하거나 변수 수가 많으면 과적합될 수 있다.

LDA 또는 QDA는 가정검정 결과만으로 자동 선택하지 말고
실제 교차검증 성능과 모형 안정성을 함께 고려하여라.

────────────────────────────────────
5. 데이터 입력 및 불러오기
────────────────────────────────────

CSV 파일이 첨부된 경우:

1. Python 실행환경에서 CSV 파일을 탐색한다.
2. 실제 파일명을 확인한다.
3. pandas의 read_csv()로 불러온다.
4. 인코딩 오류가 발생하면 다음을 순서대로 시도한다.
   - utf-8
   - utf-8-sig
   - cp949
   - euc-kr

CSV 내용이 붙여넣어진 경우:

1. 구분자가 쉼표, 탭 또는 공백인지 확인한다.
2. io.StringIO로 DataFrame을 생성한다.
3. 첫 번째 행이 변수명인지 확인한다.
4. 열 구조가 올바른지 확인한다.

입력방식을 명확히 제시하여라.

데이터가 없거나 읽을 수 없으면
임의 데이터를 생성하지 말고 필요한 조치를 안내하여라.

────────────────────────────────────
6. 데이터 구조 확인
────────────────────────────────────

Python으로 다음을 실제 출력하여라.

- 파일명 또는 입력방식
- 전체 행 수
- 전체 열 수
- 변수명
- 앞부분 20행
- 뒷부분 5행
- 변수별 자료형
- 수치형 변수
- 문자형 변수
- 식별변수 후보
- 종속변수
- 결측치 개수와 비율
- 중복 행 개수
- ID 중복 여부
- 무한대 값 존재 여부
- 변수별 고유값 수
- 상수형 또는 거의 상수형 변수

첨부 교재에 제시된 82개 관측값과 11개 변수 구조가
실제 CSV에서도 일치하는지 확인하여라.

다르면 실제 데이터를 기준으로 분석하고 차이를 보고하여라.

────────────────────────────────────
7. TYPE 변수 점검
────────────────────────────────────

TYPE을 다음과 같이 정리하여라.

- 문자열 변환
- 앞뒤 공백 제거
- 대소문자 통일
- 예상 클래스와 실제 클래스 비교

예상 클래스:

- DOMESTIC
- WILD

다음을 제시하여라.

- 클래스 수
- 클래스별 표본 수
- 클래스별 비율
- 결측 TYPE 수
- 잘못 입력된 클래스
- 클래스 불균형비

클래스 분포를 표와 막대그래프로 나타내라.

────────────────────────────────────
8. 분석변수 선정
────────────────────────────────────

ID와 TYPE은 설명변수에서 제외하여라.

다음 표를 작성하여라.

| 변수명 | 자료형 | 기초모형 사용 | 확장모형 사용 | 제외 이유 |
|--------|--------|---------------|---------------|-----------|

수치형으로 보여야 하는 변수가 문자열이면
pd.to_numeric(errors="coerce")로 변환하고
변환 실패 개수를 제시하여라.

다음 변수 구성으로 분석하여라.

기초모형:

X_basic = [HUM, ULN]

확장모형:

X_full = 사용 가능한 신체 측정변수 전체

다음 경우 변수 제외를 검토하여라.

- 결측치 비율이 지나치게 높음
- 표준편차가 0
- 거의 동일한 값을 가짐
- 다른 변수와 완전한 선형관계
- 특정 클래스에서 값이 전혀 없음
- 측정단위가 잘못 입력됨

변수는 자동으로 삭제하지 말고 근거를 제시하여라.

────────────────────────────────────
9. 결측치 구조 분석
────────────────────────────────────

첨부 자료에서는 `na.omit()` 또는 `dropna()`로
결측치가 하나라도 있는 행 전체를 제거하고 있다.

그러나 먼저 다음을 분석하여라.

- 변수별 결측치 수
- 변수별 결측치 비율
- 행별 결측치 수
- 클래스별 결측치 비율
- 완전사례 표본 수
- 결측치 제거 후 클래스별 표본 수

다음 두 전처리를 비교하여라.

[방법 A]
완전사례분석:
하나라도 결측치가 있는 행 제거

[방법 B]
훈련자료의 중앙값을 이용한 결측치 대체

중요:

- 결측치 대체값은 훈련데이터에서만 계산한다.
- 시험자료와 검증자료에는 동일한 대체값을 적용한다.
- Pipeline 내부에서 처리하여 데이터 누수를 방지한다.

기초모형과 확장모형에서
결측치 처리방법에 따른 성능을 비교하여라.

────────────────────────────────────
10. 기술통계와 탐색적 분석
────────────────────────────────────

각 클래스별로 신체 측정변수의 다음 값을 계산하여라.

- 표본 수
- 평균
- 표준편차
- 중앙값
- 최솟값
- 최댓값
- 1사분위수
- 3사분위수
- 왜도
- 첨도

다음 그래프를 작성하여라.

1. 클래스별 변수 Boxplot
2. 클래스별 Violin Plot
3. HUM과 ULN 산점도
4. 주요 변수 Pair Plot
5. 상관계수 Heatmap
6. 클래스별 평균 프로파일
7. 주요 변수 분포 Histogram

다음을 해석하여라.

- 야생칠면조와 사육칠면조의 평균 차이
- 분포가 많이 겹치는 변수
- 분리가 비교적 명확한 변수
- 이상치
- 클래스별 분산 차이
- 변수 간 높은 상관관계
- 판별에 유용할 가능성이 높은 변수

────────────────────────────────────
11. 표준화 필요성
────────────────────────────────────

신체 측정변수의 단위가 동일하거나 유사해도
변수별 분산과 범위 차이를 확인하여라.

다음 두 방식을 비교하여라.

1. 원자료 LDA·QDA
2. StandardScaler를 적용한 LDA·QDA

설명하여라.

- LDA와 QDA의 예측결과는 선형변환에 일정 부분 불변일 수 있다.
- 그러나 수치적 안정성, 정규화 모형 및 계수 비교를 위해
  표준화가 유용할 수 있다.
- 표준화 후 계수는 변수 간 상대적 영향 비교에 더 유리하다.

최종 선택한 전처리 방식과 이유를 제시하여라.

────────────────────────────────────
12. 정규성 가정 점검
────────────────────────────────────

LDA와 QDA는 각 클래스의 설명변수가
다변량 정규분포를 따른다는 가정을 사용한다.

다음을 수행하여라.

- 클래스별 Histogram
- 클래스별 Q-Q Plot
- 변수별 Shapiro–Wilk 검정
- 가능하면 Mardia 다변량 정규성 검정
- Mahalanobis Distance Q-Q Plot

다음을 설명하여라.

- 표본 수가 많으면 작은 위반도 유의할 수 있다.
- 검정결과만이 아니라 그래프와 이상치를 함께 본다.
- 정규성 위반이 있다고 분석을 즉시 중단하지 않는다.
- 실제 교차검증 성능과 함께 판단한다.

────────────────────────────────────
13. 집단별 공분산행렬
────────────────────────────────────

기초모형과 확장모형 각각에 대해
DOMESTIC과 WILD의 공분산행렬을 계산하여라.

다음을 제시하여라.

- 클래스별 공분산행렬
- 분산
- 공분산
- determinant
- rank
- condition number
- 고유값
- singular 또는 near-singular 여부

공분산행렬 Heatmap을 작성하여라.

다음을 해석하여라.

- 두 집단의 공분산 구조가 유사한가?
- 어떤 변수의 분산 차이가 큰가?
- 어떤 변수쌍의 공분산 차이가 큰가?
- QDA가 안정적으로 공분산행렬을 추정할 수 있는가?

────────────────────────────────────
14. Box’s M 검정
────────────────────────────────────

공분산행렬 동일성 검정을 실제 수행하여라.

귀무가설:

H0:
DOMESTIC과 WILD의 공분산행렬은 동일하다.

대립가설:

H1:
두 집단의 공분산행렬은 동일하지 않다.

다음을 제시하여라.

- Box’s M 통계량
- 근사 검정통계량
- 자유도
- p값
- 유의수준 0.05에서의 결론

해석:

- p ≥ 0.05:
  공분산행렬 동일성 가정을 기각할 근거가 부족함

- p < 0.05:
  공분산행렬 차이가 존재할 가능성이 있음

주의:

- Box’s M은 정규성 위반에 민감하다.
- 표본 수가 크면 작은 차이도 유의할 수 있다.
- Box’s M만으로 LDA와 QDA를 자동 선택하지 않는다.

────────────────────────────────────
15. 다중공선성 및 행렬 안정성
────────────────────────────────────

다음을 계산하여라.

- Pearson 상관계수
- VIF
- 설명변수 행렬의 rank
- condition number
- 공분산행렬 고유값
- 거의 완전한 상관관계

특히 확장모형에서는 9개 측정변수 중
서로 강하게 상관된 부위가 존재할 가능성을 검토하여라.

다중공선성이 심하면 다음을 비교하여라.

- 중복성이 큰 변수 일부 제외
- Shrinkage LDA
- PCA + LDA
- QDA reg_param 적용

────────────────────────────────────
16. 검증전략
────────────────────────────────────

표본 수가 크지 않을 가능성을 고려하여
다음 검증을 모두 수행하여라.

1. Leave-One-Out Cross-Validation
2. RepeatedStratifiedKFold
   - n_splits=5
   - n_repeats=10
   - random_state=42
3. 가능하면 층화 Train/Test split
   - 훈련 80%
   - 시험 20%
   - random_state=42

최소 클래스 표본 수가 부족하면
교차검증 Fold 수를 자동 조정하고 이유를 설명하여라.

모형 선택에는 교차검증 성능을 우선 사용하고,
시험자료가 충분할 때만 최종 독립평가로 사용하여라.

────────────────────────────────────
17. 기본 LDA 모형
────────────────────────────────────

다음 LDA를 적합하여라.

LinearDiscriminantAnalysis(
    solver="svd"
)

기초모형:

TYPE ~ HUM + ULN

확장모형:

TYPE ~ 사용 가능한 신체 측정변수 전체

각 모형에서 다음을 제시하여라.

- 클래스 순서
- 클래스별 사전확률
- 클래스별 평균
- 판별계수
- 절편
- 판별축
- 판별점수
- 사후확률
- 예측 클래스
- 설명 판별비율

두 집단이므로 판별축이 1개임을 설명하여라.

────────────────────────────────────
18. Shrinkage LDA
────────────────────────────────────

확장모형에서 변수 수가 많거나 다중공선성이 있으면
Shrinkage LDA를 수행하여라.

후보모형:

LinearDiscriminantAnalysis(
    solver="lsqr",
    shrinkage="auto"
)

필요하면 다음도 검토하여라.

LinearDiscriminantAnalysis(
    solver="eigen",
    shrinkage="auto"
)

기본 LDA와 Shrinkage LDA의
교차검증 성능과 안정성을 비교하여라.

────────────────────────────────────
19. QDA 모형
────────────────────────────────────

다음 QDA를 구축하여라.

QuadraticDiscriminantAnalysis(
    reg_param=0.0,
    store_covariance=True
)

다음 reg_param 후보를 비교하여라.

- 0.00
- 0.01
- 0.05
- 0.10
- 0.20
- 0.30
- 0.50
- 0.70
- 0.90

각 reg_param에서 다음을 계산하여라.

- LOOCV Accuracy
- 반복 CV Accuracy
- Balanced Accuracy
- Precision
- Recall
- F1-score
- ROC-AUC
- Log Loss
- 경고 발생 여부
- 공분산 특이 여부

최적 reg_param은
교차검증 Balanced Accuracy 또는 F1-score를 중심으로 선정하여라.

성능이 비슷하면 더 단순하고 안정적인 값을 선택하여라.

────────────────────────────────────
20. LDA와 QDA 판별경계
────────────────────────────────────

HUM과 ULN 두 변수에 대해
LDA와 QDA의 판별경계를 시각화하여라.

각 그래프에 다음을 포함하여라.

- x축: HUM
- y축: ULN
- 실제 DOMESTIC 관측값
- 실제 WILD 관측값
- 클래스별 중심
- 판별영역
- 결정경계
- 오분류 관측값
- 범례

다음을 해석하여라.

- LDA의 선형경계
- QDA의 곡선경계
- 두 경계가 크게 다른 영역
- 예측이 서로 다르게 나타나는 관측값
- QDA가 과도하게 복잡한 경계를 만드는지

────────────────────────────────────
21. 판별축 시각화
────────────────────────────────────

LDA의 첫 번째 판별축 점수를 시각화하여라.

다음 그래프를 작성하여라.

1. 클래스별 LD1 Histogram
2. 클래스별 LD1 Density Plot
3. LD1 Strip Plot
4. LD1 Boxplot

다음을 포함하여라.

- DOMESTIC 분포
- WILD 분포
- 클래스별 평균 판별점수
- 분포 겹침
- 오분류된 관측값
- 판별 임계영역

첨부 교재의 `plot(model1)`에 대응하는 시각화임을 설명하여라.

────────────────────────────────────
22. 사전확률 설정
────────────────────────────────────

다음 사전확률을 비교하여라.

1. 표본비율 기반 사전확률
2. 균등 사전확률
   - DOMESTIC = 0.5
   - WILD = 0.5
3. 사용자 지정 사전확률 A
   - DOMESTIC = 0.6
   - WILD = 0.4
4. 사용자 지정 사전확률 B
   - DOMESTIC = 0.4
   - WILD = 0.6

중요:

Python에서 클래스 순서를 반드시 확인한 뒤
해당 순서에 맞춰 priors를 적용하여라.

예:

classes_ = ["DOMESTIC", "WILD"]

이면:

priors=[0.6, 0.4]

는 DOMESTIC 0.6, WILD 0.4를 의미한다.

사전확률별로 다음을 비교하여라.

- Accuracy
- Balanced Accuracy
- DOMESTIC Recall
- WILD Recall
- 혼동행렬
- 예측 클래스 비율
- 신규 관측값 예측
- 사후확률 변화

사전확률을 변경하면
측정값이 같아도 최종 예측이 달라질 수 있음을 설명하여라.

────────────────────────────────────
23. LOOCV
────────────────────────────────────

첨부 교재의 `CV=TRUE`에 대응하여
Leave-One-Out Cross-Validation을 수행하여라.

각 관측값을 하나씩 제외하고 나머지 자료로 모형을 적합한 뒤,
제외된 관측값을 예측하여라.

다음을 제시하여라.

- LOOCV 예측 클래스
- LOOCV 사후확률
- 혼동행렬
- 정분류 수
- 오분류 수
- Accuracy
- Balanced Accuracy
- Precision
- Recall
- F1-score
- ROC-AUC
- 클래스별 성능

교재 예시의 `sum(diag(prop.table(ct4)))`에 해당하는 값이
Python Accuracy와 일치하는지 확인하여라.

교재 예시의 0.8787879는 실제 CSV와 사전확률 설정에서
같이 산출되는지 Python으로 검증한 후 사용하여라.

────────────────────────────────────
24. 반복 교차검증
────────────────────────────────────

LOOCV는 표본을 최대한 활용하지만
예측결과의 분산이 클 수 있으므로 반복 층화 교차검증을 추가하여라.

설정:

- RepeatedStratifiedKFold
- 5-fold
- 10회 반복
- random_state=42

각 모형에 대해 다음을 평균 ± 표준편차로 제시하여라.

- Accuracy
- Balanced Accuracy
- Precision
- Recall
- F1-score
- ROC-AUC
- Log Loss

다음 모형을 비교하여라.

- Basic LDA
- Full LDA
- Shrinkage LDA
- Basic QDA
- Regularized QDA

────────────────────────────────────
25. 혼동행렬과 분류성능
────────────────────────────────────

각 최종 후보모형에 대해 다음을 작성하여라.

1. 개수 기반 혼동행렬
2. 행 기준 정규화 혼동행렬
3. Classification Report

WILD를 양성 클래스로 지정하여 다음을 계산하여라.

- TN
- FP
- FN
- TP
- Accuracy
- Error Rate
- Sensitivity 또는 Recall
- Specificity
- Precision
- Negative Predictive Value
- F1-score
- Balanced Accuracy
- MCC

각 값의 의미를 칠면조 분류 문제에 연결하여 설명하여라.

예:

- False Negative:
  실제 WILD를 DOMESTIC으로 분류
- False Positive:
  실제 DOMESTIC을 WILD로 분류

────────────────────────────────────
26. ROC Curve와 PR Curve
────────────────────────────────────

각 모형에 대해 다음을 작성하여라.

- ROC Curve
- ROC-AUC
- Precision-Recall Curve
- Average Precision
- 비교 그래프

반드시 교차검증 예측확률 또는 시험자료 예측확률을 사용하여라.

전체 데이터에 적합하고 동일 데이터에서 계산한 ROC-AUC를
최종 성능으로 제시하지 마라.

────────────────────────────────────
27. 변수 기여도 분석
────────────────────────────────────

기초모형과 확장모형에서
각 신체 측정변수의 판별 기여도를 분석하여라.

다음을 사용하여라.

- 표준화 LDA 계수
- 클래스별 평균 차이
- 판별축 Loading
- Structure Coefficient
- Permutation Importance
- 변수 하나씩 제외한 성능 변화

다음 표를 작성하여라.

| 변수 | DOMESTIC 평균 | WILD 평균 | 표준화 차이 | LDA 계수 | 중요도 |
|------|---------------|-----------|-------------|----------|--------|

다음을 해석하여라.

- HUM과 ULN 중 어느 변수가 더 중요한가?
- 확장모형에서 가장 판별력이 큰 부위는 무엇인가?
- 상관이 높아 계수 해석에 주의해야 하는 변수는 무엇인가?
- 특정 변수 하나만으로도 상당한 분류가 가능한가?

────────────────────────────────────
28. 기초모형과 확장모형 비교
────────────────────────────────────

다음 표를 작성하여라.

| 모형 | 설명변수 | LOOCV Accuracy | 반복 CV Accuracy | Balanced Accuracy | F1 | ROC-AUC |
|------|----------|----------------|------------------|-------------------|----|---------|

비교모형:

- HUM 단일모형
- ULN 단일모형
- HUM + ULN
- 9개 변수 전체 LDA
- 9개 변수 Shrinkage LDA
- 9개 변수 QDA
- 정규화 QDA

다음을 설명하여라.

- 변수 수가 증가하면서 성능이 실제로 향상되는가?
- 성능 향상 대비 모형 복잡도가 적절한가?
- 2개 변수만으로도 충분한가?
- 전체 변수 모형이 과적합되는가?

────────────────────────────────────
29. LDA와 QDA 예측 불일치 분석
────────────────────────────────────

LDA와 QDA가 서로 다른 예측을 한 관측값을 추출하여라.

다음 표를 작성하여라.

| ID | 실제 TYPE | LDA 예측 | QDA 예측 | LDA WILD 확률 | QDA WILD 확률 |
|----|-----------|----------|----------|---------------|---------------|

다음을 해석하여라.

- 어떤 측정값에서 두 모형이 다르게 판단하는가?
- QDA의 곡선경계 때문에 발생한 차이인가?
- 해당 관측값이 이상치 또는 경계 관측값인가?
- 어느 모형의 예측이 실제 클래스와 일치하는가?

────────────────────────────────────
30. 신규 관측값 예측
────────────────────────────────────

다음 신규 자료를 기초모형으로 예측하여라.

관측값 1:

- HUM = 145
- ULN = 150

관측값 2:

- HUM = 150
- ULN = 145

다음을 각각 제시하여라.

- LDA 예측 클래스
- LDA DOMESTIC 사후확률
- LDA WILD 사후확률
- LDA 판별점수
- QDA 예측 클래스
- QDA DOMESTIC 사후확률
- QDA WILD 사후확률
- 예측확률 차이
- 최종 해석

첨부 교재에 제시된 예측결과를 그대로 사용하지 말고
실제 CSV와 실제 Python 실행결과로 검증하여라.

또한 다음 사전확률별로 결과를 비교하여라.

- 표본비율
- 0.5 / 0.5
- DOMESTIC 0.6 / WILD 0.4
- DOMESTIC 0.4 / WILD 0.6

────────────────────────────────────
31. 신규 자료 범위 점검
────────────────────────────────────

신규 HUM과 ULN 값이
학습자료의 범위 안에 있는지 확인하여라.

다음을 제시하여라.

- 학습자료 HUM 최솟값·최댓값
- 학습자료 ULN 최솟값·최댓값
- 신규 자료가 범위 안인지
- 평균에서 몇 표준편차 떨어져 있는지
- Mahalanobis Distance
- 외삽 또는 이상치 가능성

학습자료 범위를 크게 벗어나면
예측 신뢰성이 낮을 수 있음을 경고하여라.

────────────────────────────────────
32. 최종 모형 선정
────────────────────────────────────

다음 기준을 종합하여 최종 모형을 선정하여라.

- 공분산행렬 동일성
- 다변량 정규성
- 표본 수
- 설명변수 수
- 공분산행렬 안정성
- LOOCV 성능
- 반복 교차검증 성능
- 성능 표준편차
- Balanced Accuracy
- WILD Recall
- ROC-AUC
- 과적합 가능성
- 해석 가능성
- 신규 자료 예측 안정성

다음 원칙을 적용하여라.

- Box’s M이 유의하다고 무조건 QDA를 선택하지 않는다.
- QDA의 성능이 조금 높더라도 변동성이 크면 LDA를 선택할 수 있다.
- 성능이 비슷하면 더 단순한 LDA를 우선 검토한다.
- 전체 변수 LDA가 2변수 LDA보다 명확히 우수하지 않으면
  HUM·ULN 기초모형을 선택할 수 있다.
- 확장모형에서 다중공선성이 심하면 Shrinkage LDA를 우선 검토한다.

최종적으로 다음을 제시하여라.

- 최종 선택모형
- 사용 변수
- 사전확률
- 하이퍼파라미터
- LOOCV Accuracy
- 반복 CV Accuracy
- Balanced Accuracy
- F1-score
- ROC-AUC
- 선택근거
- 선택하지 않은 모형의 한계

────────────────────────────────────
33. 결과 저장
────────────────────────────────────

다음 CSV 파일을 생성하여라.

- turkey_data_summary.csv
- turkey_missing_values.csv
- turkey_class_statistics.csv
- turkey_covariance_matrices.csv
- turkey_box_m_test.csv
- turkey_lda_coefficients.csv
- turkey_qda_results.csv
- turkey_loocv_predictions.csv
- turkey_cross_validation.csv
- turkey_confusion_matrices.csv
- turkey_model_comparison.csv
- turkey_variable_importance.csv
- turkey_disagreement_cases.csv
- turkey_new_predictions.csv
- turkey_final_results.csv

다음 Excel 파일을 생성하여라.

- turkey_discriminant_analysis.xlsx

Excel Sheet:

- Original_Data
- Data_Summary
- Missing_Values
- Analysis_Variables
- Class_Statistics
- Covariance_Matrices
- Assumption_Tests
- LDA_Results
- QDA_Results
- LOOCV_Predictions
- Cross_Validation
- Confusion_Matrices
- Model_Comparison
- Variable_Importance
- Disagreement_Cases
- New_Predictions
- Final_Results

다음 그래프를 PNG로 저장하여라.

- turkey_class_distribution.png
- turkey_variable_boxplots.png
- turkey_hum_uln_scatter.png
- turkey_correlation_heatmap.png
- turkey_covariance_heatmaps.png
- turkey_lda_projection.png
- turkey_lda_qda_boundaries.png
- turkey_loocv_confusion_matrix.png
- turkey_roc_curves.png
- turkey_pr_curves.png
- turkey_model_comparison.png
- turkey_variable_importance.png
- turkey_prior_probability_comparison.png
- turkey_new_prediction.png

저장 후 파일이 실제로 생성되었는지 확인하여라.

────────────────────────────────────
34. 단계별 Python 코딩
────────────────────────────────────

코드는 다음 단계로 구분하여 작성하여라.

[코딩 1단계] 라이브러리 불러오기
[코딩 2단계] CSV 데이터 불러오기
[코딩 3단계] 데이터 구조 확인
[코딩 4단계] TYPE 및 변수 점검
[코딩 5단계] 결측치 구조 분석
[코딩 6단계] 기술통계와 시각화
[코딩 7단계] 기초모형·확장모형 변수 구성
[코딩 8단계] 표준화 및 Pipeline
[코딩 9단계] 정규성 점검
[코딩 10단계] 공분산행렬 계산
[코딩 11단계] Box’s M 검정
[코딩 12단계] 다중공선성 점검
[코딩 13단계] 기본 LDA
[코딩 14단계] Shrinkage LDA
[코딩 15단계] QDA
[코딩 16단계] QDA reg_param 탐색
[코딩 17단계] 판별축 시각화
[코딩 18단계] 판별경계 시각화
[코딩 19단계] 사전확률 비교
[코딩 20단계] LOOCV
[코딩 21단계] 반복 층화 교차검증
[코딩 22단계] 혼동행렬과 분류지표
[코딩 23단계] ROC와 PR Curve
[코딩 24단계] 변수 기여도 분석
[코딩 25단계] 기초·확장모형 비교
[코딩 26단계] LDA·QDA 불일치 관측값
[코딩 27단계] 신규 관측값 예측
[코딩 28단계] 최종 모형 선정
[코딩 29단계] 결과 저장

각 단계에서 다음 순서를 지켜라.

1. 무엇을 하는 단계인지 설명
2. 왜 필요한지 설명
3. Python 코드 제시
4. 코드를 실제 실행
5. 실제 실행결과 제시
6. 결과 해석
7. 다음 단계와의 연결

모든 분석이 끝난 후
처음부터 끝까지 한 번에 실행 가능한 전체 통합 Python 코드를 다시 제시하여라.

────────────────────────────────────
35. Python 코드 작성 원칙
────────────────────────────────────

다음 라이브러리를 기본적으로 사용하여라.

- pandas
- numpy
- matplotlib
- scipy
- scikit-learn
- statsmodels
- openpyxl

핵심 클래스:

- LinearDiscriminantAnalysis
- QuadraticDiscriminantAnalysis
- Pipeline
- SimpleImputer
- StandardScaler
- LeaveOneOut
- RepeatedStratifiedKFold
- cross_val_predict
- cross_validate
- GridSearchCV

전체 코드는 처음부터 끝까지 한 번에 실행 가능해야 한다.

코드에는 다음을 포함하여라.

- CSV 자동 탐색
- 붙여넣기 데이터 처리
- 인코딩 오류 대응
- ID 제외
- TYPE 정리
- 수치형 변환
- 결측치 처리
- 데이터 누수 방지 Pipeline
- 공분산행렬
- Box’s M
- LDA
- Shrinkage LDA
- QDA
- QDA 정규화
- LOOCV
- 반복 교차검증
- 사전확률
- 혼동행렬
- ROC·PR Curve
- 신규 자료 예측
- 결과 저장
- 오류 처리

주요 코드에는 한국어 주석을 작성하여라.

그래프는 matplotlib 중심으로 작성하여라.

한글 폰트가 없으면 사용 가능한 폰트를 탐색하거나
영문 제목을 사용하여라.

폰트 문제로 분석을 중단하지 마라.

────────────────────────────────────
36. 오류 발생 시 처리
────────────────────────────────────

다음 오류가 발생하면 오류 메시지만 제시하고 종료하지 마라.

- CSV 파일 없음
- 변수명 불일치
- TYPE 클래스가 하나뿐임
- HUM 또는 ULN 없음
- 수치형 변환 오류
- 결측치 존재
- 완전사례 표본 부족
- 특정 클래스 표본 부족
- 층화 교차검증 불가능
- 공분산행렬 특이
- Variables are collinear
- QDA 공분산 추정 오류
- reg_param 탐색 오류
- Box’s M 계산 오류
- 클래스 순서와 priors 불일치
- ROC-AUC 계산 오류
- Excel 저장 오류
- 한글 폰트 오류

오류 원인을 확인하고 합리적으로 수정한 뒤 재실행하여라.

수정한 내용과 이유를 학생이 이해할 수 있도록 설명하여라.

────────────────────────────────────
37. 결과 검증
────────────────────────────────────

최종 답변 전에 다음을 확인하여라.

- ID가 설명변수에 포함되지 않았는가?
- TYPE이 설명변수에 포함되지 않았는가?
- 클래스명이 올바르게 정리되었는가?
- priors 순서가 classes_ 순서와 일치하는가?
- 결측치 처리가 검증 Fold 안에서 이루어졌는가?
- 전체 데이터로 먼저 대체·표준화하지 않았는가?
- LOOCV가 실제로 각 관측값을 하나씩 제외해 수행되었는가?
- 혼동행렬의 실제값과 예측값 방향이 올바른가?
- WILD를 양성 클래스로 사용했는가?
- Accuracy와 혼동행렬 대각합이 일치하는가?
- 사후확률의 합이 1인가?
- 신규 자료의 변수 순서가 학습자료와 일치하는가?
- 신규 자료가 관측범위를 벗어나지 않는가?
- 저장파일이 실제로 생성되었는가?

문제가 있으면 수정한 뒤 다시 실행하여라.

────────────────────────────────────
38. 최종 답변 출력 순서
────────────────────────────────────

최종 답변은 반드시 다음 순서로 작성하여라.

① 분석 목적  
② 데이터 구조와 변수 설명  
③ LDA와 QDA의 개념 차이  
④ 입력 데이터 확인  
⑤ TYPE과 클래스 분포  
⑥ 결측치 구조와 처리방법  
⑦ 기술통계 및 탐색적 시각화  
⑧ 기초모형과 확장모형 변수 구성  
⑨ 정규성과 다중공선성 점검  
⑩ 집단별 공분산행렬  
⑪ Box’s M 검정  
⑫ 기본 LDA 결과  
⑬ Shrinkage LDA 결과  
⑭ QDA와 reg_param 선정  
⑮ 판별축 시각화  
⑯ LDA·QDA 판별경계 비교  
⑰ 사전확률 비교  
⑱ LOOCV 결과  
⑲ 반복 교차검증 결과  
⑳ 혼동행렬 및 분류성능  
㉑ ROC·PR Curve  
㉒ 변수 판별 기여도  
㉓ 기초모형·확장모형 비교  
㉔ LDA·QDA 예측 불일치 사례  
㉕ 신규 관측값 예측  
㉖ 최종 판별모형 선정  
㉗ 분석의 한계  
㉘ 단계별 Python 코드  
㉙ Python 실제 실행결과  
㉚ 전체 통합 Python 코드  
㉛ 생성된 CSV·Excel·PNG 파일  

각 단계에서는 다음을 구분하여 작성하여라.

- 무엇을 하는 단계인가?
- 왜 필요한가?
- 사용한 Python 코드
- 실제 실행결과
- 결과 해석
- 다음 단계와의 연결

모든 수치, 표, 그래프 및 결론은
제공된 실제 turkey 데이터를 Python으로 실행한 결과만을 사용하여라.

────────────────────────────────────
[사용자 입력정보]
────────────────────────────────────

[분석 목적 시작]

칠면조의 신체 부위 측정값을 이용하여
야생칠면조와 사육칠면조를 판별하고
LDA와 QDA의 성능을 비교한다.

[분석 목적 끝]

[종속변수 시작]

TYPE

[종속변수 끝]

[식별변수 시작]

ID

[식별변수 끝]

[기초 설명변수 시작]

HUM, ULN

[기초 설명변수 끝]

[확장 설명변수 시작]

자동 검토

또는:

HUM, RAD, ULN, FEMUR, TIN, CAR, D3P, COR, SCA

[확장 설명변수 끝]

[사전확률 시작]

비교할 사전확률:

1. 표본비율
2. DOMESTIC=0.5, WILD=0.5
3. DOMESTIC=0.6, WILD=0.4
4. DOMESTIC=0.4, WILD=0.6

[사전확률 끝]

[신규 관측값 시작]

관측값 1:
HUM=145
ULN=150

관측값 2:
HUM=150
ULN=145

[신규 관측값 끝]

[변수 설명 시작]

필요하면 각 신체 측정변수의 정확한 부위명과 단위를 입력하세요.

[변수 설명 끝]

[CSV 데이터 시작]

CSV 파일을 첨부한 경우에는 비워두세요.
CSV 내용을 사용할 경우 변수명을 포함하여 붙여넣으세요.

[CSV 데이터 끝]